



# docker 
# 是个轻量化的虚拟机是实现容器化技术的应用工具，基于Linux 内核的 cgroup ，namespace， aufs类的技术
# 对进程进行封装和隔离，属于操作系统层面化的虚拟化技术，隔离的进程独立于宿主和其他进程，也被称为容器
# 对各种不同的应用程序，使用daocker标准来构建，可以跑在一个操作系统上

# 资源占用小，不需要硬件虚拟，也不需要运行完整操作系统，它的资源利用率比传统过的虚拟机技术要高效，内存消耗更小
# 启动速度更快，docker应用运行在宿主机内核上，不需要启动完整的操作系统，秒级启动
# 迁移轻松，跨平台好，不管在哪个平台上他们的运行结果能保证一致
# 维护和扩展更轻松，docker 使用分层存储和镜像技术，应用重复部分服用更加容易，应用的维护更简单，基于基础镜像扩展镜像也比较简单
# 运行环境一致性，开发，测试，生成环境保证一致性
# 通过定制应用的镜像实现持续交付和部署，只需要编写dockerfile 构建应用镜像的脚本即可


# 镜像，相当于一个特殊的文件系统，一个镜像可以包含完整的操作系统，容器时镜像的实例，容器间相互隔离







# FROM python:3.9-slim   # 构建镜像需要的基础镜像
# WORKDIR /app   # 设置工作目录，第一次进入容器进入的目录
# ADD nginx-1.24.0.tar.gz /opt     # 将安装包传到目录下，同时自动解压
# RUN pip install --no-cache-dir -r requirements.txt    # 运行命令
# CMD /opt/nginx/sbin/nginx && tail -f /dev/null  # docker run 时需要启动的命令



docker build  -t nginx:v1 .   # -t 指定镜像名称  . dockerfile在当前目录





# 基础镜像
FROM python:3.9-slim

WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]



# FROM：指定基础镜像（如 node:14, nginx:alpine）
# WORKDIR：设置容器内工作目录
# COPY：复制本地文件到容器
# RUN：执行命令（安装依赖、编译等）
# EXPOSE：声明容器监听端口
# CMD：容器启动时执行的命令（只能有一个）
# ENV：设置环境变量（如 ENV NODE_ENV=production）




version: '3.8'  # Compose版本

services:
  web:  # 服务名称
    build: .  # 使用当前目录的Dockerfile
    ports:
      - "8000:8000"  # 端口映射 主机:容器
    volumes:
      - .:/app  # 挂载当前目录到容器
    environment:
      - DEBUG=1
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: examplepass
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:  # 声明持久化卷



# services：定义所有容器服务
# build：   指定Dockerfile路径
# ports：   端口映射（主机端口:容器端口）
# volumes： 目录/卷挂载
#     绑定挂载：./local/path:/container/path
#     命名卷：volume_name:/container/path

# environment：设置环境变量
# depends_on： 控制启动顺序
# networks：   自定义网络（默认自动创建）


# 启动所有服务（后台运行）
docker-compose up -d
# 停止并删除容器
docker-compose down
# 查看日志
docker-compose logs -f web
# 重建服务
docker-compose up --build web





# 镜像优化
#     使用小型基础镜像（如 alpine, slim）
#     合并RUN命令减少镜像层

    # RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*


# 安全加固:避免以root运行：    
#     RUN groupadd -r appuser && useradd -r -g appuser appuser
#     USER appuser


# 开发环境配置: 使用热重载挂载代码：
#     volumes:
#         - ./src:/app/src  # 实时同步代码变更


# 生产环境配置
#     使用指定镜像版本（避免 latest）
#     配置健康检查：
#         healthcheck:
#             test: ["CMD", "curl", "-f", "http://localhost"]
#             interval: 30s
#             timeout: 5s